/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.output.p10;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IClientAssociation;
import fr.generali.accueilclient.client.om.IClientAutre;
import fr.generali.accueilclient.client.om.IClientCollectivite;
import fr.generali.accueilclient.client.om.IClientCopropriete;
import fr.generali.accueilclient.client.om.IClientEntreprise;
import fr.generali.accueilclient.client.om.IClientParticulier;
import fr.generali.accueilclient.client.om.IClientProfessionnel;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.IPersonneMorale;
import fr.generali.accueilclient.client.om.IPersonnePhysique;
import fr.generali.accueilclient.client.om.NaturePersonne;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.pty.personnes.DTOPersonneMorale;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.pty.personnes.DTOPersonnePhysique;
import fr.generali.refservcommuns.rce.recherche.nonqualifie.pty.personnes.DTOPersonneResume;

/**
 * Transforme un {@link DTOPersonneResume} en {@link IPersonne}
 * 
 * @author Guillaume Lancelin
 */
@Component("dtoPersonneResume2PersonneConverter")
public class DTOPersonneResume2PersonneConverter implements Converter<DTOPersonneResume, IPersonne> {

    /**
     * LOGGER
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(DTOPersonneResume2PersonneConverter.class);

    /**
     * Assembler de personne physique
     */
    @Autowired
    @Qualifier("dtoPersonnePhysiqueResume2PersonnePhysiqueConverter")
    private Converter<DTOPersonnePhysique, IPersonnePhysique> dtoPersonnePhysiqueResume2PersonnePhysiqueConverter;

    /**
     * Assembler de personne morale
     */
    @Autowired
    @Qualifier("dtoPersonneMoraleResume2PersonneMoraleConverter")
    private Converter<DTOPersonneMorale, IPersonneMorale> dtoPersonneMoraleResume2PersonneMoraleConverter;

    /**
     * Assembler pour un particulier
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientParticulierConverter")
    private Converter<DTOPersonneResume, IClientParticulier> dtoPersonneResume2ClientParticulierConverter;

    /**
     * Assembler pour un pro
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientProfessionnelConverter")
    private Converter<DTOPersonneResume, IClientProfessionnel> dtoPersonneResume2ClientProfessionnelConverter;

    /**
     * Assembler pour une association
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientAssociationConverter")
    private Converter<DTOPersonneResume, IClientAssociation> dtoPersonneResume2ClientAssociationConverter;

    /**
     * Assembler pour une collectivité
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientCollectiviteConverter")
    private Converter<DTOPersonneResume, IClientCollectivite> dtoPersonneResume2ClientCollectiviteConverter;

    /**
     * Assembler pour une copropriété
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientCoproprieteConverter")
    private Converter<DTOPersonneResume, IClientCopropriete> dtoPersonneResume2ClientCoproprieteConverter;

    /**
     * Assembler pour une entreprise
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientEntrepriseConverter")
    private Converter<DTOPersonneResume, IClientEntreprise> dtoPersonneResume2ClientEntrepriseConverter;

    /**
     * Assembler pour tout autre type de client
     */
    @Autowired
    @Qualifier("dtoPersonneResume2ClientAutreConverter")
    private Converter<DTOPersonneResume, IClientAutre> dtoPersonneResume2ClientAutreConverter;

    // /**
    // * Permet de mapper adresse, téléphone et email
    // */
    // @Autowired
    // private DonneesContactP44Mapper donneesContactMapper;

    /**
     * {@inheritDoc}
     */
    public IPersonne convert(DTOPersonneResume input) {
        LOGGER.debug("assemble");

        DTOPersonnePhysique personnePhysique = input.getDTOPersonnePhysique();
        DTOPersonneMorale personneMorale = input.getDTOPersonneMorale();
        boolean isPersonnePhysique = personneMorale == null && personnePhysique != null;
        boolean isPersonneMorale = personneMorale != null;
        NaturePersonne nature = NaturePersonne.PARTICULIER;
        if (isPersonnePhysique && personnePhysique.getParticulierProfessionnel() != null
                        && !personnePhysique.getParticulierProfessionnel().isEmpty()) {
            nature = NaturePersonne.PROFESSIONNEL;
        } else {
            if (isPersonneMorale) {
                nature = NaturePersonne.getNaturePersonneFromValue(personneMorale.getTypePersonneMorale());
            }
        }

        IPersonne client = buildClient(input, nature);
        if (input.getIdentifiant().startsWith("PM")) {
            client.setNumeroClient(input.getIdentifiant().substring(2));
        } else {
            client.setNumeroClient(input.getIdentifiant());
        }
        if (StringUtils.isNotEmpty(input.getIdentifiantClientAgent())) {
            client.setNumeroClientAgent(input.getIdentifiantClientAgent());
        }
        client.setCodeIntermediaire(input.getIdIntermediaire());
        client.setTypeClient(input.getStatut());

        input.getAdresse();

        if (NaturePersonne.PARTICULIER.equals(nature) || NaturePersonne.PROFESSIONNEL.equals(nature)) {
            // Récupération des informations du niveau IPersonnePhysique
            IPersonnePhysique.class.cast(client).setPersonnePhysique(
                            dtoPersonnePhysiqueResume2PersonnePhysiqueConverter.convert(personnePhysique));
        } else {
            // Récupération des informations du niveau IPersonneMorale
            IPersonneMorale.class.cast(client).setPersonneMorale(
                            dtoPersonneMoraleResume2PersonneMoraleConverter.convert(personneMorale));
        }

        return client;
    }

    /**
     * @param input un {@link DTOPersonneResume}
     * @param nature la nature personne
     * @return une personne
     */
    private IPersonne buildClient(DTOPersonneResume input, NaturePersonne nature) {
        IPersonne client;
        switch (nature) {
            case PARTICULIER:
                client = dtoPersonneResume2ClientParticulierConverter.convert(input);
                break;
            case PROFESSIONNEL:
                client = dtoPersonneResume2ClientProfessionnelConverter.convert(input);
                break;
            case ASSOCIATION:
                client = dtoPersonneResume2ClientAssociationConverter.convert(input);
                break;
            case COLLECTIVITE:
                client = dtoPersonneResume2ClientCollectiviteConverter.convert(input);
                break;
            case COPROPRIETE:
                client = dtoPersonneResume2ClientCoproprieteConverter.convert(input);
                break;
            case ENTREPRISE:
                client = dtoPersonneResume2ClientEntrepriseConverter.convert(input);
                break;
            default:
                client = dtoPersonneResume2ClientAutreConverter.convert(input);
                break;
        }
        return client;
    }

}
